<?php
header('Content-Type: application/json');

try {
    require_once "../conexion/conexion.php";
    
    // Validar que se recibieron los datos necesarios
    if (!isset($_POST['token']) || !isset($_POST['password1']) || !isset($_POST['password2'])) {
        throw new Exception("Faltan datos requeridos");
    }

    $token = $_POST['token'];
    $password1 = $_POST['password1'];
    $password2 = $_POST['password2'];

    // Validar que las contraseñas coincidan
    if ($password1 !== $password2) {
        throw new Exception("Las contraseñas no coinciden");
    }

    // Validar requisitos de la contraseña
    if (strlen($password1) < 8) {
        throw new Exception("La contraseña debe tener al menos 8 caracteres");
    }
    if (!preg_match("/[A-Z]/", $password1)) {
        throw new Exception("La contraseña debe contener al menos una mayúscula");
    }
    if (!preg_match("/[a-z]/", $password1)) {
        throw new Exception("La contraseña debe contener al menos una minúscula");
    }
    if (!preg_match("/[0-9]/", $password1)) {
        throw new Exception("La contraseña debe contener al menos un número");
    }

    // Buscar el token en la base de datos
    $stmt = $conexion->prepare("SELECT id_usuario, usado FROM claves_activacion WHERE clave = ?");
    $stmt->execute([$token]);
    $clave = $stmt->fetch(PDO::FETCH_ASSOC);

    if (!$clave) {
        throw new Exception("Token inválido");
    }

    if ($clave['usado'] == 1) {
        throw new Exception("El token ya ha sido utilizado");
    }

    // Iniciar transacción
    $conexion->beginTransaction();

    try {
        // Actualizar la contraseña - Corregido a 'contrasena_hash'
        $password_hash = password_hash($password1, PASSWORD_DEFAULT);
        $stmt = $conexion->prepare("UPDATE usuarios SET contrasena_hash = ? WHERE id_usuario = ?");
        $stmt->execute([$password_hash, $clave['id_usuario']]);

        // Marcar el token como usado
        $stmt = $conexion->prepare("UPDATE claves_activacion SET usado = 1 WHERE clave = ?");
        $stmt->execute([$token]);

        // Confirmar la transacción
        $conexion->commit();

        echo json_encode([
            "status" => "success",
            "message" => "Contraseña actualizada exitosamente"
        ]);

    } catch (Exception $e) {
        // Si hay error, revertir la transacción
        $conexion->rollBack();
        throw new Exception("Error al actualizar la contraseña: " . $e->getMessage());
    }

} catch (Exception $e) {
    echo json_encode([
        "status" => "error",
        "message" => $e->getMessage()
    ]);
}
?>